<h2 class="heading" data-id="heading-0">小册介绍</h2>
<p>TCP 协议是我一直很想写的一个主题，因为 TCP 学起来实在是太痛苦了。刚参加工作时，TCP 协议一直是一个心头痛，知道皮毛，但是始终无法深入。在阅读了大量相关的书籍、做了很多网络编程方面的工作以后觉得掌握的过程太过曲折，这本小册并不是想重复阐述一些书上都能找到的 TCP 的理论，更多的是想跟大家分享一些学习和探究的方法，授之以渔，让大家少走一些弯路，知道从哪些方面下手来学习和分析问题。</p>
<p>写这本小册所花的精力比上一本 JVM 字节码多了很多，越写发现水越深，想说服自己实在是太难了。有时候找一个问题的原因看 RFC 看到想吐，用 keynote 画了 100 多张图，所以看这本小册会发现图特别多。</p>
<h2 class="heading" data-id="heading-1">作者介绍</h2>
<p>我是挖坑的张师傅，vim 爱好者。从事 Java 开发六年多，做过安卓、写过 Node，现在深耕后台开发，在 CVTE 担任高级技术经理，带一个 20 多人的开发团队做教育相关的产品。</p>
<p>维护了一个微信公众号「张师傅的博客」，主要写偏底层原理的分布式理论、网络协议、架构设计、Go 语言汇编相关的东西，随缘。</p>
<p>2010 年大三的时候，阴差阳错学习了当时还是 1.5 版本的安卓开发。恰逢 Google 在大陆举办了首届 Android 应用开发中国大学生挑战赛。当时穷学生买不起安卓真机，在模拟器上运行写了一个界面比较炫酷的音乐播放器就去参赛了，结果拿了个<a target="_blank" href="http://www.google.cn/university/androidchallenge/2010/" rel="nofollow noopener noreferrer">三等奖</a>，也是湖北赛区唯一获奖的作品。奖品是一部 HTC G7 手机和几千块的奖金，拿奖以后就应邀去参观了 Google 上海的办公室，安排我们在上海浪了三天。</p>
<p>毕业以后就真的去做了安卓开发，做了大半年的安卓 <code>framework</code> 移植和手写笔记软件，期间大量接触 <code>linux</code> 、<code>vim</code>、<code>git</code> 等工具。</p>
<p>后面的一年多就是我最高速成长的一段时期了，内部转岗去做了后台开发。因为喜欢保持简单，自己花了一些时间造了很多轮子，比如 REST 服务端框架、数据库连接池、SQL 执行框架、类 Dubbo 的 RPC 调用框架、基于 RocksDB 的延时消息队列、Gossip 协议框架等。</p>
<p>那段时间遇到了非常多网络相关的问题，于是对 <code>TCP</code> 协议做了深入的学习，现在条件反射一上来就可以 <code>tcpdump</code> 抓包开始分析问题了。当组员遇到问题，三下五除二帮忙找到根本原因的感觉真不错。</p>
<h2 class="heading" data-id="heading-2">为什么网络协议如此重要？</h2>
<p>之前腾讯过来的带我们部门的后端大牛 ernest 就说过一句话我觉得很经典：「我们做的事情说到底无非是给用户交付一个网络包，你有什么理由不学好呢？」。</p>
<p>识别一个码农能力的好坏很大程度上是取决于他解决问题的能力。</p>
<p>我们面对的很多系统都是黑盒系统（MySQL、Nginx 等），几乎每隔一段时间都会遇到网络相关的问题，Redis 连接超时、请求第三方平台连接被重置、系统的吞吐量上不去等。我们没有精力去把每个组件的源码都读通读透，如果不懂网络协议，尤其是 TCP 协议，将无从下手分析。遇到第三方服务有问题时，没有一些抓包现场的分析证据，对方是不会接锅的，只有无休止的扯皮。</p>
<p>如果你想成为技术牛人，网络协议绝对是一道很高的门槛。
随着开发年限的增加，越发觉得计算机底层的原理才是最有价值的。技术浪潮一波接着一波，只有掌握了操作系统、计算机网络、分布式理论等基础知识，才能在浪潮之巅游刃有余。</p>
<h2 class="heading" data-id="heading-3">纸上得来终觉浅，绝知此事要躬行</h2>
<p>TCP 协议的学习非常枯燥，尤其大部分资料都是讲原理没有什么实操的东西。如果平时工作只是写写业务代码很少有机会去深入理解 TCP 协议，也不知道学了 TCP 协议以后可以用在什么地方。所以我想写这本小册，大部分理论相关的内容我都尽量会 packetdrill、scapy、防火墙等工具构造实验可以抓包查看实际的效果，真正可以看到超时重传、零窗口探测、Nagle 算法等实际的效果。</p>
<p>这本小册并不是为了单纯介绍一些协议的理论知识，这些《TCP/IP 详解》这本书已经足够好了，更多的是想<strong>授之以渔</strong>，跟大家一起分享自己一些思路和方法，如何去研究 TCP 中的一些复杂的问题，相信掌握了这些方法和工具，一定可以助力你后续的技术提升。</p>
<h2 class="heading" data-id="heading-4">你会学到什么</h2>
<ul>
<li>为什么握手是三次，挥手要四次，挥手变成三次可以吗</li>
<li>为什么 SYN/FIN 不包含数据却要消耗一个序列号</li>
<li>如何用脚本复现同时关闭</li>
<li>TCP 的十一种状态如何模拟以及如何互相转换</li>
<li>半连接、全连接队列是什么，backlog 参数有什么作用</li>
<li>快速打开的原理是什么</li>
<li>TCP SYN Flood 攻击背后的原理</li>
<li>TCP 最不好理解的 TIME_WAIT 状态是什么</li>
<li>SO_REUSEADDR、SO_LINGER 选项对网络编程有什么影响</li>
<li>TCP 有 7 个定时器是哪些，分别在什么条件下起作用</li>
<li>发送窗口、接收窗口、拥塞窗口的区别是什么</li>
<li>流量控制、滑动窗口、拥塞控制、快重传、慢启动等概念</li>
<li>keepalive 机制</li>
<li>Nagle 算法、延迟确认的相爱相杀</li>
<li>网络学习相关的工具介绍：telnet、nc、tcpdump、wireshark、lsof、iptables、scapy 等</li>
<li>协议栈测试工具 packetdrill 的使用</li>
<li>RST 复位攻击是什么，如何杀掉一条 TCP 连接</li>
<li>常见网络面试题分析</li>
<li>实际案例分享</li>
</ul>
<p>我列了一个这本小册的思维导图</p>
<p></p><figure><img class="lazyload inited" data-src="https://user-gold-cdn.xitu.io/2019/6/26/16b914b90bca780b?imageView2/0/w/1280/h/960/format/webp/ignore-error/1" data-width="1251" data-height="1280" src="data:image/svg+xml;utf8,&lt;?xml version=&quot;1.0&quot;?&gt;&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; version=&quot;1.1&quot; width=&quot;1251&quot; height=&quot;1280&quot;&gt;&lt;/svg&gt;"><figcaption></figcaption></figure><p></p>
<h2 class="heading" data-id="heading-5">适宜人群</h2>
<ul>
<li>学习 TCP 协议多次从入门到放弃的同学</li>
<li>想通过实验方法学习 TCP 协议的同学</li>
<li>对于前端工程师，学完可以快速辨识开发中遇到的问题是前端还是后端的问题，对页面性能优化有更深的理解</li>
<li>对于后端工程师，TCP 协议可以说是必须要掌握的技能，学完能从协议和网络层面快速分析后端诸多分布式组件的问题，对提升接口的性能和分布式系统的可靠性会更有把握</li>
<li>对于测试工程师，对网络协议理解的越深，越能发现隐藏很深的 Bug，对性能测试、压力测试会有更深的理解</li>
</ul>
<h2 class="heading" data-id="heading-6">阅读这本小册需要哪些必备条件</h2>
<ul>
<li>一台 Linux 虚拟机，最好是 Centos7</li>
<li>自己动手抓包而不是只看看文章内容</li>
</ul>
<h2 class="heading" data-id="heading-7">购买须知</h2>
<ol>
<li>本小册为图文形式内容服务，共计 34 节；</li>
<li>全部文章预计 6 月 30 日更新完成；</li>
<li>购买用户可享有小册永久的阅读权限；</li>
<li>购买用户可进入小册微信群，与作者互动；</li>
<li>掘金小册为虚拟内容服务，一经购买成功概不退款；</li>
<li>掘金小册版权归北京北比信息技术有限公司所有，任何机构、媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布/发表，违者将依法追究责任；</li>
<li>在掘金小册阅读过程中，如有任何问题，请邮件联系 xiaoce@xitu.io</li>
</ol>
